package com.dyz.wsw.utils;

import org.springframework.web.server.ServerWebExchange;

import java.net.InetSocketAddress;
import java.util.Optional;

/**
 * 根据请求上下文获取ip地址
 * 先这样写,后期可以考虑将他抽成公共方法
 * @author dyz
 * Time 2024/7/1 21:09
 */
public class IPUtils {

    /**
     * 尝试获取真实ip地址
     * @param exchange web上下文
     * @return ip地址
     */
    public static String getIp(ServerWebExchange exchange) {
        // 尝试从X-Forwarded-For头中获取IP地址
        String ipAddress = exchange.getRequest().getHeaders().getFirst("X-Forwarded-For");

        // 如果X-Forwarded-For不存在或为空，则尝试从X-Real-IP头中获取
        if (ipAddress == null || ipAddress.isEmpty()) {
            ipAddress = exchange.getRequest().getHeaders().getFirst("X-Real-IP");
        }

        // 如果仍然为空，则回退到getRemoteAddress（这通常是代理服务器的IP）
        if (ipAddress == null || ipAddress.isEmpty()) {
            // 注意：getRemoteAddress()返回的是SocketAddress，需要转换为InetSocketAddress
            Optional<InetSocketAddress> remoteAddress = Optional.ofNullable(exchange.getRequest().getRemoteAddress());
            ipAddress = remoteAddress.map(InetSocketAddress::getHostString).orElse("Unknown IP");
        }

        // 如果X-Forwarded-For头存在并且包含多个IP（由逗号分隔），则通常第一个IP是客户端的IP
        if (ipAddress.contains(",")) {
            ipAddress = ipAddress.split(",")[0].trim();
        }

        return ipAddress;
    }
}
